Send expose events to exposed area when changing the window shape
authorAlexander Larsson <alex@localhost.localdomain>
Fri, 16 Jan 2009 14:09:39 +0000 (15:09 +0100)
committerAlexander Larsson <alex@localhost.localdomain>
Thu, 2 Apr 2009 08:15:19 +0000 (10:15 +0200)
gdk/gdkwindow.c

index 1555e4aa6da1df1b04abc89ab57a8c62e7940fac..dd99982a31b304423754d7da9a09b0bbd7a2a0e4 100644 (file)
@@ -6382,6 +6382,7 @@ gdk_window_shape_combine_region (GdkWindow       *window,
                                  gint             offset_y)
 {
   GdkWindowObject *private;
+  GdkRegion *old_region, *new_region, *diff;
 
   g_return_if_fail (GDK_IS_WINDOW (window));
 
@@ -6394,6 +6395,10 @@ gdk_window_shape_combine_region (GdkWindow       *window,
 
   if (private->shape)
     gdk_region_destroy (private->shape);
+  
+  old_region = NULL;
+  if (GDK_WINDOW_IS_MAPPED (window))
+    old_region = gdk_region_copy (private->clip_region);
 
   if (shape_region)
     {
@@ -6404,6 +6409,37 @@ gdk_window_shape_combine_region (GdkWindow       *window,
     private->shape = NULL;
   
   recompute_visible_regions (private, TRUE, FALSE);
+
+  if (old_region)
+    {
+      new_region = gdk_region_copy (private->clip_region);
+
+      /* New area in the window, needs invalidation */
+      diff = gdk_region_copy (new_region);
+      gdk_region_subtract (diff, old_region);
+
+      gdk_window_invalidate_region (window, diff, TRUE);
+
+      gdk_region_destroy (diff);
+
+      if (private->parent != NULL &&
+         GDK_WINDOW_TYPE (private->parent) != GDK_WINDOW_ROOT)
+       {
+         /* New area in the non-root parent window, needs invalidation */
+         diff = gdk_region_copy (old_region);
+         gdk_region_subtract (diff, new_region);
+         
+         /* Adjust region to parent window coords */
+         gdk_region_offset (diff, private->x, private->y);
+         
+         gdk_window_invalidate_region (GDK_WINDOW (private->parent), diff, TRUE);
+         
+         gdk_region_destroy (diff);
+       }
+
+      gdk_region_destroy (new_region);
+      gdk_region_destroy (old_region);
+    }
 }
 
 static void